package com.zyx.xunyilu.controller;

import com.zyx.xunyilu.config.jwt.JWTUtils;
import com.zyx.xunyilu.utils.CodeDesUtils;
import com.zyx.xunyilu.utils.RestResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName: PictureController
 * @author: zyx
 * @E-mail: 1377631190@qq.com
 * @DATE: 2019/12/9 20:44
 */
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/picture")
public class PictureController {

    @Autowired
    JWTUtils jwtUtils;

    @Value("${file.upload.path}")
    private String uploadPath = "F:/xunyilu/picture";

    /**
     * 通过图片名称获取返回图片
     * @param name  图片名称
     * @return  返回图片
     */
    @GetMapping(value = "/get", produces = MediaType.IMAGE_JPEG_VALUE)
    public byte[] getPicture(@RequestParam("name") String name) {
        try {
            File file = new File(uploadPath, name);
            FileInputStream inputStream = new FileInputStream(file);
            byte[] bytes = new byte[inputStream.available()];
            inputStream.read(bytes, 0, inputStream.available());
            return bytes;
        } catch (IOException e) {
            log.error("获取图片失败!");
        }
        return null;
    }

    /**
     * 通过文件流和用户token上传多图片
     * @param files 图片集合
     * @param token 用户token
     * @return  返回图片保存路径
     */
    @PostMapping("/add")
    public RestResponse addPicture(@RequestParam("file") MultipartFile[] files,
                                   @RequestAttribute String token) {
        if (null == files || files.length <= 0) {
            return RestResponse.fail();
        }
        List<String> resultPath = new ArrayList<>();
        String username = jwtUtils.getUsername(token);
        for (MultipartFile t : files) {
            try {
                String s = this.saveFile(t, uploadPath);
                resultPath.add(s);
                log.info("{} -上传了- {} -文件, 大小- {} KB", username, s, t.getSize() / 1024);
            } catch (Exception e) {
                log.error(e.getMessage());
            }
        }
        return RestResponse.ok(resultPath);
    }

    /**
     * 文件保存方法
     * @param file  文件
     * @param destination   文件描述
     * @return  返回保存的文件名称
     */
    private String saveFile(MultipartFile file, String destination) throws Exception {
        // 获取上传的文件名称，并结合存放路径，构建新的文件名称
        String filename = file.getOriginalFilename();
        if (filename == null) {
            return null;
        }

        // 修改文件名称,将文件名称格式修改为 "时间戳" + "_" + "文件名编码后" + "文件后缀名"
        String substring = filename.substring(filename.lastIndexOf("."));
        filename = new Date().getTime() + "_" + CodeDesUtils.encryption(filename) + substring;
        File filepath = new File(destination, filename);

        // 判断路径是否存在，不存在则新创建一个
        if (!filepath.getParentFile().exists()) {
            filepath.getParentFile().mkdirs();
        }

        // 将上传文件保存到目标文件目录
        file.transferTo(new File(destination + File.separator + filename));
        return filename;
    }

}
